package com.java.jvm.loader;

/**
 * 获取类的加载体系(常用类加载器有哪些),通过这些类加载器从磁盘或网络将class文件读取到内存。
 * 这些再读取到内存会生成一个Class对象，但这个Class对象是否是唯一的，取决于类和类加载器。
 *
 * 说明：同一个类，但类加加载器不同，在内存中可以生成不同的字节码对象。
 *
 */
public class ClassLoaderTypeTests {
    public static void main(String[] args) {
        //获取应用类加载器(我们自己写类默认都是通过这个类加载器加载的)
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
        //获取扩展类加载器-负载加载jre中的扩展类库(ext)//sun.misc.Launcher$ExtClassLoader@2503dbd3
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader);//ExtClassLoader
        //获取启动类加载器(根类加载器)-负责加载jre中的基础类库
        ClassLoader bootClassLoader=extClassLoader.getParent();//null (c/c++)
        System.out.println(bootClassLoader);//null (BootStrapClassLoader)

        //分析String类对应的类加载器是谁？
        ClassLoader stringClassLoader = String.class.getClassLoader();
        System.out.println(stringClassLoader);//null (BootStrapClassLoader)

        //我们自己写的类对应的类加载器是谁？
        ClassLoader classLoader = ClassLoaderTypeTests.class.getClassLoader();
        System.out.println(classLoader);

    }
}
